package top.frsf.rpc.channel;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import top.frsf.rpc.code.decode.RpcMessageDecoder;
import top.frsf.rpc.code.encode.RpcMessageEncoder;
import top.frsf.rpc.handler.RpcResponseHandler;

import static top.frsf.rpc.constants.RpcConstants.*;

/**
 * @author He Kuntao
 * @since 2025/7/8 15:08
 */
public class ClientChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        // 协议编解码配置（需与服务端完全匹配）
        ch.pipeline().addLast(
                // 1.Netty自带协议解码器，解决粘包、半包问题
                new LengthFieldBasedFrameDecoder(
                        MAX_FRAME_LENGTH,
                        LENGTH_FIELD_OFFSET,
                        LENGTH_FIELD_LENGTH,
                        NUM_SKIP_BODY_LENGTH,
                        FINISH_SKIP_LENGTH
                ),
                // 2. 自定义协议解码器
                new RpcMessageDecoder(),
                // 3. 自定义协议编码器
                new RpcMessageEncoder(),
                // 4. RPC 响应处理器
                new RpcResponseHandler()
        );
    }
}
